package com.spider.moudle.entity;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.spider.moudle.util.DateUtil;

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Linbo Hu on 2017/11/15.
 * 爬虫任务分发实体
 */
public class Task implements Serializable {

    private static final long serialVersionUID = -4027712785181484832L;

    /**
     * 要爬取的网址  --必填
     */
    private String url;

    /**
     * 任务类型(普通言论、用户主页等) --必填
     */
    private TaskType taskType;

    /**
     * 网站类型(论坛、新闻等) --必填
     */
    private WebType webType;

    /**
     * 言论/用户的唯一标识，主要用来查询该任务是否被抓取过
     * 如果是言论我们就以 平台_言论ID 作为该言论的唯一标识
     * 如果是用户我们就以 平台_用户ID 作为该用户的唯一标识  --必填
     */
    private String taskKey;

    /**
     * 地域实体 --选填
     */
    private Area area;

    /**
     * 任务生成时间  --自动生成不用手动填
     */
    private Date createTime;

    /**
     * 自定义的一些参数  --选填
     */
    private Map<String, Object> parameter = new HashMap<>();

    {
        createTime = new Date();
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public TaskType getTaskType() {
        return taskType;
    }

    public void setTaskType(TaskType taskType) {
        this.taskType = taskType;
    }

    public WebType getWebType() {
        return webType;
    }

    public void setWebType(WebType webType) {
        this.webType = webType;
    }

    public String getTaskKey() {
        return taskKey;
    }

    public void setTaskKey(String taskKey) {
        this.taskKey = taskKey;
    }

    public Area getArea() {
        return area;
    }

    public void setArea(Area area) {
        this.area = area;
    }

    public Map<String, Object> getParameter() {
        return parameter;
    }

    public void setParameter(Map<String, Object> parameter) {
        this.parameter = parameter;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /**
     * 放入参数
     * @param key
     * @param object
     */
    public void put(String key, Object object) {
        this.parameter.put(key, object);
    }

    /**
     * 获取参数
     * @param key
     * @return
     */
    public Object get(String key) {
        return this.parameter.get(key);
    }

    /**
     * 空构造方法
     */
    public Task() {
    }

    /**
     * 此构造方法适用于既不需要发布(更新时间)也不需要地域类型的任务
     * @param url
     * @param taskType
     * @param webType
     * @param taskKey
     */
    public Task(String url, TaskType taskType, WebType webType, String taskKey) {
        this.url = url;
        this.taskType = taskType;
        this.webType = webType;
        this.taskKey = taskKey;
    }

    /**
     * 此构造方法适用于需要地域类型但不需要言论时间的任务
     * @param url
     * @param taskType
     * @param webType
     * @param taskKey
     * @param area
     */
    public Task(String url, TaskType taskType, WebType webType, String taskKey, Area area) {
        this.url = url;
        this.taskType = taskType;
        this.webType = webType;
        this.taskKey = taskKey;
        this.area = area;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }

    @Override
    public int hashCode() {
        return this.url.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        Task task = (Task) obj;
        return this.url.equals(task.getUrl());
    }



}
